h1b_df <- DATA
DATA_certificate <- DATA %>%
filter(case_status == "certified") %>%
group_by(worksite_state_abb, year) %>%
summarise(num = n())
DATA_new <- DATA_certificate %>%
ungroup(worksite_state_abb) %>%
mutate(worksite_state_abb = str_to_upper(worksite_state_abb))
d1 <-
ichoropleth(
num ~ worksite_state_abb,
data = DATA_new,
animate = 'year',
ncuts = 9,
legend = FALSE,
geographyConfig = list(popupTemplate = "#!function(geo, data) {return '<div class=\"hoverinfo\"><strong>' + data.worksite_state_abb + '<br>' + data.num + '</strong></div>';}!#")
)
d1$save('rMaps.html', cdn = TRUE)
htmltools::includeHTML("rMaps.html")
DATA %>%
group_by(year, stem) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n, fill = as.factor(stem))) +
geom_bar(stat = "identity",
position = position_stack(reverse = FALSE),
alpha = 0.8) +
scale_fill_manual(
values = c("#00B2E4", "#0F2A48"),
name = "",
labels = c("non-STEM", "STEM")
) +
labs(y = "\n Number", x = "\n Year") +
scale_y_continuous(
labels = function(x) {
paste0(x / 1000, 'K')
}
) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5)) +
theme(legend.position = "top")

DATA %>%
filter(prevailing_wage >= 0 & prevailing_wage <= 600000) %>%
ggplot(aes(x = as.factor(year), y = prevailing_wage)) +
geom_boxplot(
aes(fill = as.factor(stem)),
outlier.shape = NA,
alpha = 0.9,
color = "white"
) +
theme_minimal() +
labs(x = "\n Year", y = "Prevailing wage \n") +
scale_y_continuous(
labels = function(x) {
paste0(x / 1000, "K")
}
) +
scale_color_manual(
values = c("#00B2E4", "#0F2A48"),
name = "",
labels = c("non-STEM", "STEM")
) +
scale_fill_manual(
values = c("#00B2E4", "#0F2A48"),
name = "",
labels = c("non-STEM", "STEM")
) +
coord_cartesian(ylim = c(40000, 100000))

DATA %>%
filter(year == 2018) %>%
filter(prevailing_wage >= 0 & prevailing_wage <= 400000) %>%
ggplot(aes(
x = prevailing_wage,
color = as.factor(stem),
fill = as.factor(stem)
)) +
geom_density(adjust = 2, alpha = 0.7) +
theme_classic() +
labs(x = "\n Prevailing wage ($)",
y = expression(Density ~ (10 ^ {
-3
})),
title = "") +
scale_x_continuous(
labels = function(x) {
paste0(x / 1000, 'K')
}
) +
scale_y_continuous(
labels = function(x) {
paste0(x * 1000, "")
}
) +
scale_color_manual(
values = c("#00B2E4", "#0F2A48"),
name = "",
labels = c("non-STEM", "STEM")
) +
scale_fill_manual(
values = c("#00B2E4", "#0F2A48"),
name = "",
labels = c("non-STEM", "STEM")
) +
theme(plot.title = element_text(hjust = 0.5)) +
theme_minimal()

dt <- DATA %>%
mutate(job_title = ifelse(
str_detect(job_title, "business") &
(
str_detect(job_title, "analyst") |
str_detect(job_title, "intelligence")
) ,
"business analyst",
job_title
)) %>%
mutate(job_title = ifelse(
str_detect(job_title, "data") &
(
str_detect(job_title, "engineer") |
str_detect(job_title, "warehouse")
),
"data engineer",
job_title
)) %>%
mutate(job_title = ifelse(
str_detect(job_title, "data") &
str_detect(job_title, "scientist"),
"data scientist",
job_title
)) %>%
mutate(job_title = ifelse(
str_detect(job_title, "data") &
str_detect(job_title, "analyst|analytics"),
"data analyst",
job_title
)) %>%
mutate(job_title = ifelse(
str_detect(job_title, "machine|deep") &
str_detect(job_title, "learning"),
"deep learning & machine learning",
job_title
)) %>%
mutate(job_title = ifelse(
str_detect(job_title, "product") &
str_detect(job_title, "analyst|engineer|data"),
"data product analyst",
job_title
)) %>%
mutate(job_title = ifelse(
str_detect(job_title, "senior systems analyst jc60"),
"senior systems analyst",
job_title
)) %>%
filter(stem == 1)
dt %>%
filter(year == 2018) %>%
group_by(job_title) %>%
summarise(n = n()) %>%
arrange(-n) %>%
slice(1:20) %>%
mutate(cat = case_when(
str_detect(job_title, "systems|programmer") ~ "non-data",
str_detect(job_title, "analyst|data") ~ "data",
TRUE ~ "non-data"
)) %>%
arrange(n) %>%
ggbarplot(
"job_title",
"n",
fill = "cat",
palette = c("#FC2967", "#00B2E4"),
alpha = 0.8,
orientation = "horiz",
color = "white"
) +
labs(y = "Number of Aplications", x = "Job Titles") +
theme_minimal() +
theme(legend.position = "none") +
theme(panel.grid.major.y = element_blank())

# original
dt %>%
filter(year == 2018) %>%
group_by(job_title) %>%
summarise(n = n()) %>%
arrange(-n) %>%
slice(1:20) %>%
arrange(n) %>%
ggbarplot(
"job_title",
"n",
fill = "#00B2E4",
alpha = 0.8,
orientation = "horiz",
color = "white"
) +
labs(y = "Number of Aplications", x = "Job Titles") +
theme_minimal() +
theme(panel.grid.major.y = element_blank())

dt <- DATA %>%
filter(
data_job_title %in% c(
"Business Analyst",
"Data Engineer",
"Data Analyst",
"Data Scientist"
)
) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
arrange(-n)
p1 <- dt %>%
ggplot(aes(x = year, y = n)) +
#geom_point(aes(color = data_job_title), size = 2)+
geom_line(aes(color = data_job_title), size = 1.2) +
labs(
y = "",
x = "Year",
title = "Applications Data related jobs",
face = "bold",
size = 14
) +
scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
name = "") +
theme_minimal() +
theme(
legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust = 0.5))
p1

filtered_job <- DATA %>%
filter(
data_job_title %in% c(
"Business Analyst",
"Data Engineer",
"Data Scientist",
"Data Analyst"
)
)
filtered_job$data_job_title <-
factor(
filtered_job$data_job_title,
levels = c(
"Data Analyst",
"Business Analyst",
"Data Engineer",
"Data Scientist"
),
ordered = TRUE
)
#filtered_job %>% group_by(data_job_title) %>% summarise(mean = mean(prevailing_wage))
filtered_job %>%
ggplot(aes(y = prevailing_wage, x = data_job_title)) +
geom_boxplot(
fill = "#00B2E4",
outlier.shape = NA,
color = "white",
width = 0.5
) +
coord_cartesian(ylim = c(50000, 120000)) +
theme_minimal() +
labs(x = "\n Job title", y = "Prevailing wage (per year) \n", title = "Prevailing wages in data related jobs") +
theme(
plot.title = element_text(size = 1),
text = element_text(size = 12),
axis.title = element_text(size = 16),
axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 10)
) +
theme(plot.title = element_text(hjust = 0.5))

top_com <- DATA %>%
filter(
data_job_title %in% c(
"Business Analyst",
"Data Analyst",
"Data Engineer",
"Data Scientist"
)
) %>%
group_by(employer_name) %>%
summarise(n = n()) %>%
arrange(-n) %>%
slice(1:20) %>%
ungroup()
top_com <- top_com$employer_name
spa_data <- DATA %>%
filter(employer_name %in% top_com) %>%
filter(employer_name != "capgemini america inc") %>%
filter(
data_job_title %in% c(
"Business Analyst",
"Data Analyst",
"Data Engineer",
"Data Scientist"
)
) %>%
group_by(employer_name, year) %>%
summarise(n = n())
con = c("infosys limited",
"deloitte consulting llp",
"amazon",
"facebook",
"ibm")
myColor <- c("#465881", "#FFB6C1", "#00909e", "#00B2E4", "#FC2967")
# c(amazon, "deloitte", "#facebook", "ibm", "info")
ggplot(spa_data, aes(x = year, y = n, group = employer_name)) +
geom_line(alpha = 0.3,
size = 0.2) +
labs(x = "Year",
y = "Number",
col = "") +
theme_classic() +
geom_line(
data = subset(spa_data, employer_name %in% con),
aes(col = employer_name),
size = 1.2
) +
theme(
plot.title = element_text(size = 14),
text = element_text(size = 12),
axis.title = element_text(face = "bold"),
axis.text.x = element_text(size = 11)
) +
scale_color_manual(
values = myColor,
breaks = c(
"infosys limited",
"deloitte consulting llp",
"amazon",
"facebook",
"ibm"
),
labels = c(
"Infosys Limited",
"Deloitte Consulting",
"Amazon",
"Facebook",
"IBM"
)
) +
theme_minimal() +
theme(legend.position = "right")

soc_top_tech <- c("Apple",
"Microsoft",
"Amazon",
"Facebook",
"Google",
"IBM")
DATA %>%
filter(
data_job_title %in% c(
"Business Analyst",
"Data Engineer",
"Data Analyst",
"Data Scientist"
)
) %>%
mutate(employer_name = ifelse(
str_detect(employer_name, 'apple'),
'Apple',
ifelse(
str_detect(employer_name, 'microsoft'),
'Microsoft',
ifelse(
str_detect(employer_name, 'amazon'),
'Amazon',
ifelse(
str_detect(employer_name, 'facebook'),
'Facebook',
ifelse(
str_detect(employer_name, 'google'),
'Google',
ifelse(str_detect(employer_name, 'ibm'), 'IBM', 'no')
)
)
)
)
)) %>%
group_by(employer_name, year) %>%
summarise(tot = n()) %>%
filter(!employer_name %in% c("no", NA)) %>%
ungroup() %>%
ggplot() +
scale_color_brewer(palette = "RdBu") +
geom_line(aes(x = year, y = tot, color = employer_name), size = 1.5) +
labs(y = "Number of Applications", x = "Year", color = "Employer") +
theme_minimal()

filtered_job_all <- DATA %>%
filter(
data_job_title %in% c(
"Business Analyst",
"Data Analyst",
"Data Engineer",
"Data Scientist"
)
) %>%
mutate(employer_name = ifelse(
str_detect(employer_name, 'apple'),
'Apple',
ifelse(
str_detect(employer_name, 'microsoft'),
'Microsoft',
ifelse(
str_detect(employer_name, 'amazon'),
'Amazon',
ifelse(
str_detect(employer_name, 'facebook'),
'Facebook',
ifelse(
str_detect(employer_name, 'google'),
'Google',
ifelse(str_detect(employer_name, 'ibm'), 'IBM', employer_name)
)
)
)
)
))
IBM
h1b_ibm <- h1b_df %>%
filter(str_detect(employer_name, 'ibm'))
h1b_ibm <- h1b_ibm %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
arrange(-n)
con = c("Business Analyst",
"Data Engineer",
"Data Scientist",
"Data Analyst")
ggplot(h1b_ibm, aes(x = year, y = n, group = data_job_title)) +
geom_line(alpha = 0.3,
size = 0.2) +
labs(title = "",
x = "Year",
y = "Number",
col = 'Job Title') +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5)) +
geom_line(
data = subset(h1b_ibm, data_job_title %in% con),
aes(col = data_job_title),
size = 1.1
) +
scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
name = "") +
theme(
plot.title = element_text(size = 14, family = "Helvetica"),
text = element_text(size = 12, family = "Helvetica"),
#axis.title = element_text(face="bold"),
axis.text.x = element_text(size = 11),
legend.position = "none"
) +
coord_cartesian(ylim = c(0, 1000))

filtered_job_all %>%
filter(employer_name == 'IBM') %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n)) +
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title), size = 1.2) +
labs(
y = "",
x = "Year",
title = "",
face = "bold",
size = 14
) +
scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
name = "") +
theme_minimal() +
theme(
legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust = 0.5))

NA
NA
Infosys
filtered_job_all %>%
filter(str_detect(employer_name, 'infosys')) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n)) +
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title), size = 1.2) +
labs(
y = "",
x = "Year",
title = "",
face = "bold",
size = 14
) +
scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
name = "") +
theme_minimal() +
theme(legend.position = "top") +
theme(plot.title = element_text(hjust = 0.5))

Accenture
filtered_job_all %>%
filter(str_detect(employer_name, 'accenture')) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n)) +
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title), size = 1.2) +
labs(
y = "",
x = "Year",
title = "",
face = "bold",
size = 14
) +
scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
name = "") +
theme_minimal() +
theme(
legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust = 0.5))

Microsoft
filtered_job_all %>%
filter(employer_name == 'Microsoft') %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n)) +
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title), size = 1.2) +
labs(
y = "",
x = "Year",
title = "",
face = "bold",
size = 14
) +
scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
name = "") +
theme_minimal() +
theme(
legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust = 0.5))

Amazon
filtered_job_all %>%
filter(employer_name == 'Amazon') %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n)) +
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title), size = 1.2) +
labs(
y = "",
x = "Year",
title = "",
face = "bold",
size = 14
) +
scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
name = "") +
theme_minimal() +
theme(
legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust = 0.5))

Deloitte
filtered_job_all %>%
filter(str_detect(employer_name, "deloitte")) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n)) +
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title), size = 1.2) +
labs(
y = "",
x = "Year",
title = "",
face = "bold",
size = 14
) +
scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
name = "") +
theme_minimal() +
theme(
legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust = 0.5))

Facebook
filtered_job_all %>%
filter(str_detect(employer_name, "Facebook")) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n)) +
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title), size = 1.2) +
labs(
y = "",
x = "Year",
title = "",
face = "bold",
size = 14
) +
scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
name = "") +
theme_minimal() +
theme(
legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust = 0.5))

Apple
filtered_job_all %>%
filter(str_detect(employer_name, "Apple")) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n)) +
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title), size = 1.2) +
labs(
y = "",
x = "Year",
title = "",
face = "bold",
size = 14
) +
scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
name = "") +
theme_minimal() +
theme(
legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust = 0.5))

Google
filtered_job_all %>%
filter(str_detect(employer_name, "Google")) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n)) +
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title), size = 1.2) +
labs(
y = "",
x = "Year",
title = "",
face = "bold",
size = 14
) +
scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
name = "") +
theme_minimal() +
theme(
legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust = 0.5))

Data job per state in 2018
DATA_certificate_data <- DATA %>%
filter(case_status == "certified") %>%
filter(
data_job_title %in% c(
"Business Analyst",
"Data Engineer",
"Data Analyst",
"Data Scientist"
)
) %>%
group_by(worksite_state_abb, year) %>%
summarise(num = n())
DATA_new_data <- DATA_certificate_data %>%
ungroup(worksite_state_abb) %>%
mutate(worksite_state_abb = str_to_upper(worksite_state_abb))
d1 <-
ichoropleth(
num ~ worksite_state_abb,
data = DATA_new_data,
animate = 'year',
ncuts = 9,
legend = FALSE,
geographyConfig = list(popupTemplate = "#!function(geo, data) {return '<div class=\"hoverinfo\"><strong>' + data.worksite_state_abb + '<br>' + data.num + '</strong></div>';}!#")
)
d1$save('rMaps_data.html', cdn = TRUE)
htmltools::includeHTML("rMaps_data.html")
Alluvia
filtered_job <- DATA %>%
filter(year == 2018) %>%
filter(
data_job_title %in% c(
"Business Analyst",
"Data Analyst",
"Data Engineer",
"Data Scientist"
)
)
top_10_state <- filtered_job %>%
group_by(worksite_state_abb) %>%
summarise(count = n()) %>%
arrange(desc(count)) %>%
slice(1:10)
flows <- filtered_job %>%
filter(worksite_state_abb %in% top_10_state$worksite_state_abb) %>%
group_by(data_job_title,
worksite_state_abb) %>%
summarise(count = n())
ggplot(flows,
aes(y = count, axis1 = data_job_title, axis2 = worksite_state_abb)) +
geom_alluvium(aes(fill = data_job_title)) +
geom_stratum(
width = 1 / 8,
fill = "#0F2A48",
color = "grey",
alpha = 0.9
) +
geom_label(stat = "stratum", label.strata = TRUE) +
labs(x = "", y = "") +
theme_minimal() +
theme(legend.position = "top") +
scale_fill_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
name = NULL) +
scale_x_discrete(limits = c("Job title", "State"),
expand = c(.05, .05)) +
theme(axis.text.x = element_text(size = 12, face = "bold")) +
theme(line = element_blank())

MAP - data job with the highest number in each city
ggplot(points) +
geom_sf(
data = state_maps,
color = "white",
fill = "lightgrey",
alpha = 0.5
) +
geom_point(aes(
x = jitter(lon, 100),
y = jitter(lat, 100),
color = max_job,
size = max
), alpha = 0.5) +
scale_color_manual(
values = c(
"Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"
),
name = "Job Title"
) +
theme(
panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
legend.box = "horizontal",
legend.position = c(0, -0.1),
legend.justification = c(0, 0)
) +
labs(x = "",
y = "",
title = "",
size = "Number")

ggplot(points_ca) +
geom_sf(
data = state_maps_ca,
color = "white",
fill = "lightgrey",
alpha = 0.5
) +
geom_point(aes(
x = jitter(lon),
y = jitter(lat),
color = max_job,
size = max
), alpha = 0.5) +
scale_color_manual(
values = c(
"Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"
),
name = "Job Title"
) +
theme(
panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
#legend.position = c(0,0), legend.justification = c(0,0)
) +
labs(x = "",
y = "",
title = "",
size = "Number")

ggplot(points_tx) +
geom_sf(
data = state_maps_tx,
color = "white",
fill = "lightgrey",
alpha = 0.5
) +
geom_point(aes(
x = jitter(lon),
y = jitter(lat),
color = max_job,
size = max
), alpha = 0.5) +
scale_color_manual(
values = c(
"Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"
),
name = "Job Title"
) +
theme(
panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
#legend.position = c(0,0), legend.justification = c(0,0)
) +
labs(x = "",
y = "",
title = "",
size = "Number")

ggplot(points_northeast) +
geom_sf(
data = state_maps_northeast,
color = "white",
fill = "lightgrey",
alpha = 0.5
) +
geom_point(aes(
x = jitter(lon),
y = jitter(lat),
color = max_job,
size = max
), alpha = 0.5) +
scale_color_manual(
values = c(
"Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"
),
name = "Job Title"
) +
theme(
panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
#legend.position = c(0,0), legend.justification = c(0,0)
) +
labs(x = "",
y = "",
title = "",
size = "Number")

ggplot(points_midwest) +
geom_sf(
data = state_maps_midwest,
color = "white",
fill = "lightgrey",
alpha = 0.5
) +
geom_point(aes(
x = jitter(lon, 100),
y = jitter(lat, 100),
color = max_job,
size = max
), alpha = 0.5) +
scale_color_manual(
values = c(
"Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"
),
name = "Job Title"
) +
theme(
panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
#legend.position = c(0,0), legend.justification = c(0,0)
) +
labs(x = "",
y = "",
title = "",
size = "Number")

ggplot(points_fl) +
geom_sf(
data = state_maps_fl,
color = "white",
fill = "lightgrey",
alpha = 0.5
) +
geom_point(aes(
x = jitter(lon),
y = jitter(lat),
color = max_job,
size = max
), alpha = 0.5) +
scale_color_manual(
values = c(
"Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"
),
name = "Job Title"
) +
theme(
panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
#legend.position = c(0,0), legend.justification = c(0,0)
) +
labs(x = "",
y = "",
title = "",
size = "Number")

ggplot(points_wa) +
geom_sf(
data = state_maps_wa,
color = "white",
fill = "lightgrey",
alpha = 0.5
) +
geom_point(aes(
x = jitter(lon),
y = jitter(lat),
color = max_job,
size = max
), alpha = 0.5) +
scale_color_manual(
values = c(
"Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"
),
name = "Job Title"
) +
theme(
panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
#legend.position = c(0,0), legend.justification = c(0,0)
) +
labs(x = "",
y = "",
title = "",
size = "Number")

ggplot(points_tn) +
geom_sf(
data = state_maps_tn,
color = "white",
fill = "lightgrey",
alpha = 0.5
) +
geom_point(aes(
x = jitter(lon),
y = jitter(lat),
color = max_job,
size = max
), alpha = 0.5) +
scale_color_manual(
values = c(
"Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"
),
name = "Job Title"
) +
theme(
panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
#legend.position = c(0,0), legend.justification = c(0,0)
) +
labs(x = "",
y = "",
title = "",
size = "Number")

DATA %>%
filter(worksite_state_abb == "TN") %>%
group_by(year, data_relation) %>%
summarise(n = n()) %>%
ggplot(aes(
x = year,
y = n,
fill = as.factor(data_relation)
)) +
geom_bar(stat = "identity",
position = "dodge",
alpha = 0.8) +
scale_fill_manual(
values = c("#00B2E4", "#0F2A48"),
name = "",
labels = c("Data jobs", "Others")
) +
labs(y = "\n Number", x = "\n Year") +
#scale_y_continuous(labels = function(x){paste0(x/1000, 'K')}) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5)) +
theme(legend.position = "top")

LS0tCnRpdGxlOiAiRmluYWxfUmVwb3J0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3IgaW1wb3J0IGRhdGF9CmgxYl9kZiA8LSBEQVRBCmBgYAoKCgpgYGB7ciBpbnRlcmFjdGl2ZSBtYXAgZm9yIGFsbCBqb2JzfQpEQVRBX2NlcnRpZmljYXRlIDwtIERBVEEgJT4lCiAgZmlsdGVyKGNhc2Vfc3RhdHVzID09ICJjZXJ0aWZpZWQiKSAlPiUKICBncm91cF9ieSh3b3Jrc2l0ZV9zdGF0ZV9hYmIsIHllYXIpICU+JQogIHN1bW1hcmlzZShudW0gPSBuKCkpCgpEQVRBX25ldyA8LSAgREFUQV9jZXJ0aWZpY2F0ZSAlPiUKICB1bmdyb3VwKHdvcmtzaXRlX3N0YXRlX2FiYikgJT4lCiAgbXV0YXRlKHdvcmtzaXRlX3N0YXRlX2FiYiA9IHN0cl90b191cHBlcih3b3Jrc2l0ZV9zdGF0ZV9hYmIpKQoKZDEgPC0KICBpY2hvcm9wbGV0aCgKICAgIG51bSB+IHdvcmtzaXRlX3N0YXRlX2FiYiwKICAgIGRhdGEgPSBEQVRBX25ldywKICAgIGFuaW1hdGUgPSAneWVhcicsCiAgICBuY3V0cyA9IDksCiAgICBsZWdlbmQgPSBGQUxTRSwKICAgIGdlb2dyYXBoeUNvbmZpZyA9IGxpc3QocG9wdXBUZW1wbGF0ZSA9ICIjIWZ1bmN0aW9uKGdlbywgZGF0YSkge3JldHVybiAnPGRpdiBjbGFzcz1cImhvdmVyaW5mb1wiPjxzdHJvbmc+JyArIGRhdGEud29ya3NpdGVfc3RhdGVfYWJiICsgJzxicj4nICsgZGF0YS5udW0gKyAnPC9zdHJvbmc+PC9kaXY+Jzt9ISMiKQogICkKCmQxJHNhdmUoJ3JNYXBzLmh0bWwnLCBjZG4gPSBUUlVFKQpgYGAKCmBgYHtyIHNob3cgaW50ZXJhY3RpdmUgbWFwfQpodG1sdG9vbHM6OmluY2x1ZGVIVE1MKCJyTWFwcy5odG1sIikKYGBgCgoKYGBge3Igc3RlbS1ub25zdGVtIGJhciBjaGFydCwgZmlnLmhlaWdodD0yLjYsIGZpZy53aWR0aD0yLjN9CkRBVEEgJT4lCiAgZ3JvdXBfYnkoeWVhciwgc3RlbSkgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuLCBmaWxsID0gYXMuZmFjdG9yKHN0ZW0pKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLAogICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2socmV2ZXJzZSA9IEZBTFNFKSwKICAgICAgICAgICBhbHBoYSA9IDAuOCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgdmFsdWVzID0gYygiIzAwQjJFNCIsICIjMEYyQTQ4IiksCiAgICBuYW1lID0gIiIsCiAgICBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikKICApICsKICBsYWJzKHkgPSAiXG4gTnVtYmVyIiwgeCA9ICJcbiBZZWFyIikgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgcGFzdGUwKHggLyAxMDAwLCAnSycpCiAgICB9CiAgKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQpgYGAKCgpgYGB7ciBQcmV2YWlsaW5nIHdhZ2Ugb2Ygc3RlbS1ub25zdGVtIGJveHBsb3R9CkRBVEEgJT4lCiAgZmlsdGVyKHByZXZhaWxpbmdfd2FnZSA+PSAwICYgcHJldmFpbGluZ193YWdlIDw9IDYwMDAwMCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYXMuZmFjdG9yKHllYXIpLCB5ID0gcHJldmFpbGluZ193YWdlKSkgKwogIGdlb21fYm94cGxvdCgKICAgIGFlcyhmaWxsID0gYXMuZmFjdG9yKHN0ZW0pKSwKICAgIG91dGxpZXIuc2hhcGUgPSBOQSwKICAgIGFscGhhID0gMC45LAogICAgY29sb3IgPSAid2hpdGUiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHggPSAiXG4gWWVhciIsIHkgPSAiUHJldmFpbGluZyB3YWdlIFxuIikgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgcGFzdGUwKHggLyAxMDAwLCAiSyIpCiAgICB9CiAgKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgdmFsdWVzID0gYygiIzAwQjJFNCIsICIjMEYyQTQ4IiksCiAgICBuYW1lID0gIiIsCiAgICBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikKICApICsKICBzY2FsZV9maWxsX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoIiMwMEIyRTQiLCAiIzBGMkE0OCIpLAogICAgbmFtZSA9ICIiLAogICAgbGFiZWxzID0gYygibm9uLVNURU0iLCAiU1RFTSIpCiAgKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDQwMDAwLCAxMDAwMDApKQpgYGAKCgpgYGB7ciBwcmV2YWlsaW5nIHdhZ2UgZGVuc2l0eSBpbiAyMDE4fQpEQVRBICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JQogIGZpbHRlcihwcmV2YWlsaW5nX3dhZ2UgPj0gMCAmIHByZXZhaWxpbmdfd2FnZSA8PSA0MDAwMDApICU+JQogIGdncGxvdChhZXMoCiAgICB4ID0gcHJldmFpbGluZ193YWdlLAogICAgY29sb3IgPSBhcy5mYWN0b3Ioc3RlbSksCiAgICBmaWxsID0gYXMuZmFjdG9yKHN0ZW0pCiAgKSkgKwogIGdlb21fZGVuc2l0eShhZGp1c3QgPSAyLCBhbHBoYSA9IDAuNykgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyh4ID0gIlxuIFByZXZhaWxpbmcgd2FnZSAoJCkiLAogICAgICAgeSA9IGV4cHJlc3Npb24oRGVuc2l0eSB+ICgxMCBeIHsKICAgICAgICAgLTMKICAgICAgIH0pKSwKICAgICAgIHRpdGxlID0gIiIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBmdW5jdGlvbih4KSB7CiAgICAgIHBhc3RlMCh4IC8gMTAwMCwgJ0snKQogICAgfQogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgcGFzdGUwKHggKiAxMDAwLCAiIikKICAgIH0KICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwKICAgIG5hbWUgPSAiIiwKICAgIGxhYmVscyA9IGMoIm5vbi1TVEVNIiwgIlNURU0iKQogICkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgdmFsdWVzID0gYygiIzAwQjJFNCIsICIjMEYyQTQ4IiksCiAgICBuYW1lID0gIiIsCiAgICBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikKICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCgpgYGB7ciBzdGVtIGpvYnMgYmFyc30KZHQgPC0gREFUQSAlPiUKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKAogICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJidXNpbmVzcyIpICYKICAgICAgKAogICAgICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdCIpIHwKICAgICAgICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiaW50ZWxsaWdlbmNlIikKICAgICAgKSAsCiAgICAiYnVzaW5lc3MgYW5hbHlzdCIsCiAgICBqb2JfdGl0bGUKICApKSAlPiUKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKAogICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikgJgogICAgICAoCiAgICAgICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJlbmdpbmVlciIpIHwKICAgICAgICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAid2FyZWhvdXNlIikKICAgICAgKSwKICAgICJkYXRhIGVuZ2luZWVyIiwKICAgIGpvYl90aXRsZQogICkpICU+JQogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2UoCiAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImRhdGEiKSAmCiAgICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAic2NpZW50aXN0IiksCiAgICAiZGF0YSBzY2llbnRpc3QiLAogICAgam9iX3RpdGxlCiAgKSkgJT4lCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZSgKICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpICYKICAgICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGFuYWx5dGljcyIpLAogICAgImRhdGEgYW5hbHlzdCIsCiAgICBqb2JfdGl0bGUKICApKSAlPiUKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKAogICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJtYWNoaW5lfGRlZXAiKSAmCiAgICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAibGVhcm5pbmciKSwKICAgICJkZWVwIGxlYXJuaW5nICYgbWFjaGluZSBsZWFybmluZyIsCiAgICBqb2JfdGl0bGUKICApKSAlPiUKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKAogICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJwcm9kdWN0IikgJgogICAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3R8ZW5naW5lZXJ8ZGF0YSIpLAogICAgImRhdGEgcHJvZHVjdCBhbmFseXN0IiwKICAgIGpvYl90aXRsZQogICkpICU+JQogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2UoCiAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInNlbmlvciBzeXN0ZW1zIGFuYWx5c3QgamM2MCIpLAogICAgInNlbmlvciBzeXN0ZW1zIGFuYWx5c3QiLAogICAgam9iX3RpdGxlCiAgKSkgJT4lCiAgZmlsdGVyKHN0ZW0gPT0gMSkKCmR0ICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JQogIGdyb3VwX2J5KGpvYl90aXRsZSkgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGFycmFuZ2UoLW4pICU+JQogIHNsaWNlKDE6MjApICU+JQogIG11dGF0ZShjYXQgPSBjYXNlX3doZW4oCiAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInN5c3RlbXN8cHJvZ3JhbW1lciIpIH4gIm5vbi1kYXRhIiwKICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxkYXRhIikgfiAiZGF0YSIsCiAgICBUUlVFIH4gIm5vbi1kYXRhIgogICkpICU+JQogIGFycmFuZ2UobikgJT4lIAogIGdnYmFycGxvdCgKICAgICJqb2JfdGl0bGUiLAogICAgIm4iLAogICAgZmlsbCA9ICJjYXQiLAogICAgcGFsZXR0ZSA9IGMoIiNGQzI5NjciLCAiIzAwQjJFNCIpLAogICAgYWxwaGEgPSAwLjgsCiAgICBvcmllbnRhdGlvbiA9ICJob3JpeiIsCiAgICBjb2xvciA9ICJ3aGl0ZSIKICApICsKICBsYWJzKHkgPSAiTnVtYmVyIG9mIEFwbGljYXRpb25zIiwgeCA9ICJKb2IgVGl0bGVzIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKQoKCiMgb3JpZ2luYWwKZHQgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAxOCkgJT4lCiAgZ3JvdXBfYnkoam9iX3RpdGxlKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgYXJyYW5nZSgtbikgJT4lCiAgc2xpY2UoMToyMCkgJT4lCiAgYXJyYW5nZShuKSAlPiUKICBnZ2JhcnBsb3QoCiAgICAiam9iX3RpdGxlIiwKICAgICJuIiwKICAgIGZpbGwgPSAiIzAwQjJFNCIsCiAgICBhbHBoYSA9IDAuOCwKICAgIG9yaWVudGF0aW9uID0gImhvcml6IiwKICAgIGNvbG9yID0gIndoaXRlIgogICkgKwogIGxhYnMoeSA9ICJOdW1iZXIgb2YgQXBsaWNhdGlvbnMiLCB4ID0gIkpvYiBUaXRsZXMiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKCmBgYHtyIGRhdGEgam9icyBudW1iZXIgcGVyIHllYXIsZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NH0KZHQgPC0gREFUQSAlPiUKICBmaWx0ZXIoCiAgICBkYXRhX2pvYl90aXRsZSAlaW4lIGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiwKICAgICAgIkRhdGEgRW5naW5lZXIiLAogICAgICAiRGF0YSBBbmFseXN0IiwKICAgICAgIkRhdGEgU2NpZW50aXN0IgogICAgKQogICkgJT4lCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBhcnJhbmdlKC1uKQoKcDEgPC0gZHQgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSArCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikrCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDEuMikgKwogIGxhYnMoCiAgICB5ID0gIiIsCiAgICB4ID0gIlllYXIiLAogICAgdGl0bGUgPSAiQXBwbGljYXRpb25zIERhdGEgcmVsYXRlZCBqb2JzIiwKICAgIGZhY2UgPSAiYm9sZCIsCiAgICBzaXplID0gMTQKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZDMjk2NyIsICIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCnAxCmBgYAoKCmBgYHtyIGRhdGEgam9iIHNhbGFyeSBib3hwbG90fQpmaWx0ZXJlZF9qb2IgPC0gREFUQSAlPiUKICBmaWx0ZXIoCiAgICBkYXRhX2pvYl90aXRsZSAlaW4lIGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiwKICAgICAgIkRhdGEgRW5naW5lZXIiLAogICAgICAiRGF0YSBTY2llbnRpc3QiLAogICAgICAiRGF0YSBBbmFseXN0IgogICAgKQogICkKCgpmaWx0ZXJlZF9qb2IkZGF0YV9qb2JfdGl0bGUgPC0KICBmYWN0b3IoCiAgICBmaWx0ZXJlZF9qb2IkZGF0YV9qb2JfdGl0bGUsCiAgICBsZXZlbHMgPSBjKAogICAgICAiRGF0YSBBbmFseXN0IiwKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiLAogICAgICAiRGF0YSBFbmdpbmVlciIsCiAgICAgICJEYXRhIFNjaWVudGlzdCIKICAgICksCiAgICBvcmRlcmVkID0gVFJVRQogICkKCgojZmlsdGVyZWRfam9iICU+JSBncm91cF9ieShkYXRhX2pvYl90aXRsZSkgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihwcmV2YWlsaW5nX3dhZ2UpKQpmaWx0ZXJlZF9qb2IgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcHJldmFpbGluZ193YWdlLCB4ID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9ib3hwbG90KAogICAgZmlsbCA9ICIjMDBCMkU0IiwKICAgIG91dGxpZXIuc2hhcGUgPSBOQSwKICAgIGNvbG9yID0gIndoaXRlIiwKICAgIHdpZHRoID0gMC41CiAgKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDUwMDAwLCAxMjAwMDApKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHggPSAiXG4gSm9iIHRpdGxlIiwgeSA9ICJQcmV2YWlsaW5nIHdhZ2UgKHBlciB5ZWFyKSBcbiIsIHRpdGxlID0gIlByZXZhaWxpbmcgd2FnZXMgaW4gZGF0YSByZWxhdGVkIGpvYnMiKSArCiAgdGhlbWUoCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxKSwKICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApCiAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKCmBgYHtyIGRhdGEgam9icyBpbiB0b3AgY29tcGFuaWVzIHBlciB5ZWFyfQp0b3BfY29tIDwtIERBVEEgJT4lCiAgZmlsdGVyKAogICAgZGF0YV9qb2JfdGl0bGUgJWluJSBjKAogICAgICAiQnVzaW5lc3MgQW5hbHlzdCIsCiAgICAgICJEYXRhIEFuYWx5c3QiLAogICAgICAiRGF0YSBFbmdpbmVlciIsCiAgICAgICJEYXRhIFNjaWVudGlzdCIKICAgICkKICApICU+JQogIGdyb3VwX2J5KGVtcGxveWVyX25hbWUpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBhcnJhbmdlKC1uKSAlPiUKICBzbGljZSgxOjIwKSAlPiUKICB1bmdyb3VwKCkKCnRvcF9jb20gPC0gdG9wX2NvbSRlbXBsb3llcl9uYW1lCgpzcGFfZGF0YSA8LSBEQVRBICU+JQogIGZpbHRlcihlbXBsb3llcl9uYW1lICVpbiUgdG9wX2NvbSkgJT4lCiAgZmlsdGVyKGVtcGxveWVyX25hbWUgIT0gImNhcGdlbWluaSBhbWVyaWNhIGluYyIpICU+JQogIGZpbHRlcigKICAgIGRhdGFfam9iX3RpdGxlICVpbiUgYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiLAogICAgICAiRGF0YSBBbmFseXN0IiwKICAgICAgIkRhdGEgRW5naW5lZXIiLAogICAgICAiRGF0YSBTY2llbnRpc3QiCiAgICApCiAgKSAlPiUKICBncm91cF9ieShlbXBsb3llcl9uYW1lLCB5ZWFyKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkKCmNvbiA9IGMoImluZm9zeXMgbGltaXRlZCIsCiAgICAgICAgImRlbG9pdHRlIGNvbnN1bHRpbmcgbGxwIiwKICAgICAgICAiYW1hem9uIiwKICAgICAgICAiZmFjZWJvb2siLAogICAgICAgICJpYm0iKQpteUNvbG9yIDwtIGMoIiM0NjU4ODEiLCAiI0ZGQjZDMSIsICIjMDA5MDllIiwgIiMwMEIyRTQiLCAiI0ZDMjk2NyIpCgojIGMoYW1hem9uLCAiZGVsb2l0dGUiLCAiI2ZhY2Vib29rIiwgImlibSIsICJpbmZvIikKCmdncGxvdChzcGFfZGF0YSwgYWVzKHggPSB5ZWFyLCB5ID0gbiwgZ3JvdXAgPSBlbXBsb3llcl9uYW1lKSkgKwogIGdlb21fbGluZShhbHBoYSA9IDAuMywKICAgICAgICAgICAgc2l6ZSA9IDAuMikgKwogIGxhYnMoeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICIiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZW9tX2xpbmUoCiAgICBkYXRhID0gc3Vic2V0KHNwYV9kYXRhLCBlbXBsb3llcl9uYW1lICVpbiUgY29uKSwKICAgIGFlcyhjb2wgPSBlbXBsb3llcl9uYW1lKSwKICAgIHNpemUgPSAxLjIKICApICsKICB0aGVtZSgKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpCiAgKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgdmFsdWVzID0gbXlDb2xvciwKICAgIGJyZWFrcyA9IGMoCiAgICAgICJpbmZvc3lzIGxpbWl0ZWQiLAogICAgICAiZGVsb2l0dGUgY29uc3VsdGluZyBsbHAiLAogICAgICAiYW1hem9uIiwKICAgICAgImZhY2Vib29rIiwKICAgICAgImlibSIKICAgICksCiAgICBsYWJlbHMgPSBjKAogICAgICAiSW5mb3N5cyBMaW1pdGVkIiwKICAgICAgIkRlbG9pdHRlIENvbnN1bHRpbmciLAogICAgICAiQW1hem9uIiwKICAgICAgIkZhY2Vib29rIiwKICAgICAgIklCTSIKICAgICkKICApICArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKQoKYGBgCgoKCgpgYGB7ciBkYXRhIGpvYiBudW0gaW4gdG9wIHRlY2ggcGVyIHllYXJ9CnNvY190b3BfdGVjaCA8LSBjKCJBcHBsZSIsCiAgICAgICAgICAgICAgICAgICJNaWNyb3NvZnQiLAogICAgICAgICAgICAgICAgICAiQW1hem9uIiwKICAgICAgICAgICAgICAgICAgIkZhY2Vib29rIiwKICAgICAgICAgICAgICAgICAgIkdvb2dsZSIsCiAgICAgICAgICAgICAgICAgICJJQk0iKQoKCkRBVEEgJT4lCiAgZmlsdGVyKAogICAgZGF0YV9qb2JfdGl0bGUgJWluJSBjKAogICAgICAiQnVzaW5lc3MgQW5hbHlzdCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiwKICAgICAgIkRhdGEgQW5hbHlzdCIsCiAgICAgICJEYXRhIFNjaWVudGlzdCIKICAgICkKICApICU+JQogIG11dGF0ZShlbXBsb3llcl9uYW1lID0gaWZlbHNlKAogICAgc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnYXBwbGUnKSwKICAgICdBcHBsZScsCiAgICBpZmVsc2UoCiAgICAgIHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgJ21pY3Jvc29mdCcpLAogICAgICAnTWljcm9zb2Z0JywKICAgICAgaWZlbHNlKAogICAgICAgIHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgJ2FtYXpvbicpLAogICAgICAgICdBbWF6b24nLAogICAgICAgIGlmZWxzZSgKICAgICAgICAgIHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgJ2ZhY2Vib29rJyksCiAgICAgICAgICAnRmFjZWJvb2snLAogICAgICAgICAgaWZlbHNlKAogICAgICAgICAgICBzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdnb29nbGUnKSwKICAgICAgICAgICAgJ0dvb2dsZScsCiAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdpYm0nKSwgJ0lCTScsICdubycpCiAgICAgICAgICApCiAgICAgICAgKQogICAgICApCiAgICApCiAgKSkgJT4lCiAgZ3JvdXBfYnkoZW1wbG95ZXJfbmFtZSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKHRvdCA9IG4oKSkgJT4lCiAgZmlsdGVyKCFlbXBsb3llcl9uYW1lICVpbiUgYygibm8iLCBOQSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBnZ3Bsb3QoKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiUmRCdSIpICsKICBnZW9tX2xpbmUoYWVzKHggPSB5ZWFyLCB5ID0gdG90LCBjb2xvciA9IGVtcGxveWVyX25hbWUpLCBzaXplID0gMS41KSArCiAgbGFicyh5ID0gIk51bWJlciBvZiBBcHBsaWNhdGlvbnMiLCB4ID0gIlllYXIiLCBjb2xvciA9ICJFbXBsb3llciIpICsKICB0aGVtZV9taW5pbWFsKCkKCmBgYAoKCgpgYGB7ciBjbGVhbiBuYW1lcyBmb3IgdGVjaCBjb21wYW5pZXN9CmZpbHRlcmVkX2pvYl9hbGwgPC0gREFUQSAlPiUKICBmaWx0ZXIoCiAgICBkYXRhX2pvYl90aXRsZSAlaW4lIGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiwKICAgICAgIkRhdGEgQW5hbHlzdCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IgogICAgKQogICkgJT4lCiAgbXV0YXRlKGVtcGxveWVyX25hbWUgPSBpZmVsc2UoCiAgICBzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdhcHBsZScpLAogICAgJ0FwcGxlJywKICAgIGlmZWxzZSgKICAgICAgc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnbWljcm9zb2Z0JyksCiAgICAgICdNaWNyb3NvZnQnLAogICAgICBpZmVsc2UoCiAgICAgICAgc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnYW1hem9uJyksCiAgICAgICAgJ0FtYXpvbicsCiAgICAgICAgaWZlbHNlKAogICAgICAgICAgc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnZmFjZWJvb2snKSwKICAgICAgICAgICdGYWNlYm9vaycsCiAgICAgICAgICBpZmVsc2UoCiAgICAgICAgICAgIHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgJ2dvb2dsZScpLAogICAgICAgICAgICAnR29vZ2xlJywKICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgJ2libScpLCAnSUJNJywgZW1wbG95ZXJfbmFtZSkKICAgICAgICAgICkKICAgICAgICApCiAgICAgICkKICAgICkKICApKSAKICAKYGBgCgoKIyMgSUJNIAoKYGBge3IgcHJlcCBmb3IgSUJNfQpoMWJfaWJtIDwtIGgxYl9kZiAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnaWJtJykpCgpoMWJfaWJtIDwtIGgxYl9pYm0gJT4lCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBhcnJhbmdlKC1uKQpgYGAKCmBgYHtyIGFsbCBqb2JzIGluIElCTSBwZXIgeWVhciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9Mi41fQpjb24gPSBjKCJCdXNpbmVzcyBBbmFseXN0IiwKICAgICAgICAiRGF0YSBFbmdpbmVlciIsCiAgICAgICAgIkRhdGEgU2NpZW50aXN0IiwKICAgICAgICAiRGF0YSBBbmFseXN0IikKZ2dwbG90KGgxYl9pYm0sIGFlcyh4ID0geWVhciwgeSA9IG4sIGdyb3VwID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLAogICAgICAgICAgICBzaXplID0gMC4yKSArCiAgbGFicyh0aXRsZSA9ICIiLAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICdKb2IgVGl0bGUnKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGdlb21fbGluZSgKICAgIGRhdGEgPSBzdWJzZXQoaDFiX2libSwgZGF0YV9qb2JfdGl0bGUgJWluJSBjb24pLAogICAgYWVzKGNvbCA9IGRhdGFfam9iX3RpdGxlKSwKICAgIHNpemUgPSAxLjEKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZDMjk2NyIsICIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIpICsKICB0aGVtZSgKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSAiSGVsdmV0aWNhIiksCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFtaWx5ID0gIkhlbHZldGljYSIpLAogICAgI2F4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIgogICkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxMDAwKSkKYGBgCgoKCmBgYHtyIGRhdGEgam9icyBpbiBJQk0gcGVyIHllYXJ9CmZpbHRlcmVkX2pvYl9hbGwgJT4lCiAgZmlsdGVyKGVtcGxveWVyX25hbWUgPT0gJ0lCTScpICU+JQogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSArCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAxLjIpICsKICBsYWJzKAogICAgeSA9ICIiLAogICAgeCA9ICJZZWFyIiwKICAgIHRpdGxlID0gIiIsCiAgICBmYWNlID0gImJvbGQiLAogICAgc2l6ZSA9IDE0CiAgKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNGQzI5NjciLCAiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KQogICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQoKCmBgYAoKIyBJbmZvc3lzCmBgYHtyIGRhdGEgam9icyBpbiBJbmZvc3lzIHBlciB5ZWFyfQoKZmlsdGVyZWRfam9iX2FsbCAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnaW5mb3N5cycpKSAlPiUKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkgKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMS4yKSArCiAgbGFicygKICAgIHkgPSAiIiwKICAgIHggPSAiWWVhciIsCiAgICB0aXRsZSA9ICIiLAogICAgZmFjZSA9ICJib2xkIiwKICAgIHNpemUgPSAxNAogICkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkMyOTY3IiwgIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCmBgYAoKIyBBY2NlbnR1cmUKYGBge3IgZGF0YSBqb2JzIGluIEFjY2VudHVyZSBwZXIgeWVhcn0KZmlsdGVyZWRfam9iX2FsbCAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnYWNjZW50dXJlJykpICU+JQogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSArCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAxLjIpICsKICBsYWJzKAogICAgeSA9ICIiLAogICAgeCA9ICJZZWFyIiwKICAgIHRpdGxlID0gIiIsCiAgICBmYWNlID0gImJvbGQiLAogICAgc2l6ZSA9IDE0CiAgKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNGQzI5NjciLCAiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KQogICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQoKYGBgCgojIE1pY3Jvc29mdApgYGB7ciBkYXRhIGpvYnMgaW4gTWljcm9zb2Z0IHBlciB5ZWFyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JQogIGZpbHRlcihlbXBsb3llcl9uYW1lID09ICdNaWNyb3NvZnQnKSAlPiUKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkgKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMS4yKSArCiAgbGFicygKICAgIHkgPSAiIiwKICAgIHggPSAiWWVhciIsCiAgICB0aXRsZSA9ICIiLAogICAgZmFjZSA9ICJib2xkIiwKICAgIHNpemUgPSAxNAogICkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkMyOTY3IiwgIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgojIEFtYXpvbgpgYGB7ciBkYXRhIGpvYnMgaW4gQW1hem9uIHBlciB5ZWFyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JQogIGZpbHRlcihlbXBsb3llcl9uYW1lID09ICdBbWF6b24nKSAlPiUKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkgKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMS4yKSArCiAgbGFicygKICAgIHkgPSAiIiwKICAgIHggPSAiWWVhciIsCiAgICB0aXRsZSA9ICIiLAogICAgZmFjZSA9ICJib2xkIiwKICAgIHNpemUgPSAxNAogICkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkMyOTY3IiwgIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgojIERlbG9pdHRlCmBgYHtyIGRhdGEgam9icyBpbiBEZWxvaXR0ZSBwZXIgeWVhcn0KZmlsdGVyZWRfam9iX2FsbCAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAiZGVsb2l0dGUiKSkgJT4lCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpICsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDEuMikgKwogIGxhYnMoCiAgICB5ID0gIiIsCiAgICB4ID0gIlllYXIiLAogICAgdGl0bGUgPSAiIiwKICAgIGZhY2UgPSAiYm9sZCIsCiAgICBzaXplID0gMTQKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZDMjk2NyIsICIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKIyBGYWNlYm9vawpgYGB7ciBkYXRhIGpvYnMgaW4gRmFjZWJvb2sgcGVyIHllYXJ9CmZpbHRlcmVkX2pvYl9hbGwgJT4lCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgIkZhY2Vib29rIikpICU+JQogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSArCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAxLjIpICsKICBsYWJzKAogICAgeSA9ICIiLAogICAgeCA9ICJZZWFyIiwKICAgIHRpdGxlID0gIiIsCiAgICBmYWNlID0gImJvbGQiLAogICAgc2l6ZSA9IDE0CiAgKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNGQzI5NjciLCAiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KQogICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCiMgQXBwbGUKYGBge3IgZGF0YSBqb2JzIGluIEFwcGxlIHBlciB5ZWFyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JQogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICJBcHBsZSIpKSAlPiUKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkgKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMS4yKSArCiAgbGFicygKICAgIHkgPSAiIiwKICAgIHggPSAiWWVhciIsCiAgICB0aXRsZSA9ICIiLAogICAgZmFjZSA9ICJib2xkIiwKICAgIHNpemUgPSAxNAogICkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkMyOTY3IiwgIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgojIEdvb2dsZQpgYGB7ciBkYXRhIGpvYnMgaW4gR29vZ2xlIHBlciB5ZWFyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JQogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICJHb29nbGUiKSkgJT4lCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpICsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDEuMikgKwogIGxhYnMoCiAgICB5ID0gIiIsCiAgICB4ID0gIlllYXIiLAogICAgdGl0bGUgPSAiIiwKICAgIGZhY2UgPSAiYm9sZCIsCiAgICBzaXplID0gMTQKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZDMjk2NyIsICIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKCgoKCiMgRGF0YSBqb2IgcGVyIHN0YXRlIGluIDIwMTgKCmBgYHtyIGludGVyYWN0aXZlIG1hcCBmb3IgZGF0YSBqb2JzfQpEQVRBX2NlcnRpZmljYXRlX2RhdGEgPC0gREFUQSAlPiUKICBmaWx0ZXIoY2FzZV9zdGF0dXMgPT0gImNlcnRpZmllZCIpICU+JQogIGZpbHRlcigKICAgIGRhdGFfam9iX3RpdGxlICVpbiUgYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiLAogICAgICAiRGF0YSBFbmdpbmVlciIsCiAgICAgICJEYXRhIEFuYWx5c3QiLAogICAgICAiRGF0YSBTY2llbnRpc3QiCiAgICApCiAgKSAlPiUKICBncm91cF9ieSh3b3Jrc2l0ZV9zdGF0ZV9hYmIsIHllYXIpICU+JQogIHN1bW1hcmlzZShudW0gPSBuKCkpCgpEQVRBX25ld19kYXRhIDwtICBEQVRBX2NlcnRpZmljYXRlX2RhdGEgJT4lCiAgdW5ncm91cCh3b3Jrc2l0ZV9zdGF0ZV9hYmIpICU+JQogIG11dGF0ZSh3b3Jrc2l0ZV9zdGF0ZV9hYmIgPSBzdHJfdG9fdXBwZXIod29ya3NpdGVfc3RhdGVfYWJiKSkKCmQxIDwtCiAgaWNob3JvcGxldGgoCiAgICBudW0gfiB3b3Jrc2l0ZV9zdGF0ZV9hYmIsCiAgICBkYXRhID0gREFUQV9uZXdfZGF0YSwKICAgIGFuaW1hdGUgPSAneWVhcicsCiAgICBuY3V0cyA9IDksCiAgICBsZWdlbmQgPSBGQUxTRSwKICAgIGdlb2dyYXBoeUNvbmZpZyA9IGxpc3QocG9wdXBUZW1wbGF0ZSA9ICIjIWZ1bmN0aW9uKGdlbywgZGF0YSkge3JldHVybiAnPGRpdiBjbGFzcz1cImhvdmVyaW5mb1wiPjxzdHJvbmc+JyArIGRhdGEud29ya3NpdGVfc3RhdGVfYWJiICsgJzxicj4nICsgZGF0YS5udW0gKyAnPC9zdHJvbmc+PC9kaXY+Jzt9ISMiKQogICkKCmQxJHNhdmUoJ3JNYXBzX2RhdGEuaHRtbCcsIGNkbiA9IFRSVUUpCmBgYAoKYGBge3Igc2hvdyBpbnRlcmFjdGl2ZSBtYXAgZm9yIGRhdGEgam9ic30KaHRtbHRvb2xzOjppbmNsdWRlSFRNTCgick1hcHNfZGF0YS5odG1sIikKYGBgCgoKIyMgQWxsdXZpYQpgYGB7ciBkYXRhIGpvYnMgYWxsdXZpYSBmb3IgdG9wIHN0YXRlcyxmaWcud2lkdGg9NCwgZmlnLmhlaWdodD0yLjd9CmZpbHRlcmVkX2pvYiA8LSBEQVRBICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JQogIGZpbHRlcigKICAgIGRhdGFfam9iX3RpdGxlICVpbiUgYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiLAogICAgICAiRGF0YSBBbmFseXN0IiwKICAgICAgIkRhdGEgRW5naW5lZXIiLAogICAgICAiRGF0YSBTY2llbnRpc3QiCiAgICApCiAgKQoKCnRvcF8xMF9zdGF0ZSA8LSBmaWx0ZXJlZF9qb2IgJT4lCiAgZ3JvdXBfYnkod29ya3NpdGVfc3RhdGVfYWJiKSAlPiUKICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JQogIGFycmFuZ2UoZGVzYyhjb3VudCkpICU+JQogIHNsaWNlKDE6MTApCgpmbG93cyA8LSBmaWx0ZXJlZF9qb2IgJT4lCiAgZmlsdGVyKHdvcmtzaXRlX3N0YXRlX2FiYiAlaW4lIHRvcF8xMF9zdGF0ZSR3b3Jrc2l0ZV9zdGF0ZV9hYmIpICU+JQogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLAogICAgICAgICAgIHdvcmtzaXRlX3N0YXRlX2FiYikgJT4lCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpKQoKCmdncGxvdChmbG93cywKICAgICAgIGFlcyh5ID0gY291bnQsIGF4aXMxID0gZGF0YV9qb2JfdGl0bGUsIGF4aXMyID0gd29ya3NpdGVfc3RhdGVfYWJiKSkgKwogIGdlb21fYWxsdXZpdW0oYWVzKGZpbGwgPSBkYXRhX2pvYl90aXRsZSkpICsKICBnZW9tX3N0cmF0dW0oCiAgICB3aWR0aCA9IDEgLyA4LAogICAgZmlsbCA9ICIjMEYyQTQ4IiwKICAgIGNvbG9yID0gImdyZXkiLAogICAgYWxwaGEgPSAwLjkKICApICsKICBnZW9tX2xhYmVsKHN0YXQgPSAic3RyYXR1bSIsIGxhYmVsLnN0cmF0YSA9IFRSVUUpICsKICBsYWJzKHggPSAiIiwgeSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNGQzI5NjciLCAiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwKICAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiSm9iIHRpdGxlIiwgIlN0YXRlIiksCiAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKC4wNSwgLjA1KSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIikpICsKICB0aGVtZShsaW5lID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCgoKIyBNQVAgLSBkYXRhIGpvYiB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBpbiBlYWNoIGNpdHkgCmBgYHtyIGRhdGEgY2l0eSBVUyBtYXB9CmdncGxvdChwb2ludHMpICsKICBnZW9tX3NmKAogICAgZGF0YSA9IHN0YXRlX21hcHMsCiAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICBmaWxsID0gImxpZ2h0Z3JleSIsCiAgICBhbHBoYSA9IDAuNQogICkgKwogIGdlb21fcG9pbnQoYWVzKAogICAgeCA9IGppdHRlcihsb24sIDEwMCksCiAgICB5ID0gaml0dGVyKGxhdCwgMTAwKSwKICAgIGNvbG9yID0gbWF4X2pvYiwKICAgIHNpemUgPSBtYXgKICApLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwKICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IgogICAgKSwKICAgIG5hbWUgPSAiSm9iIFRpdGxlIgogICkgKwogIHRoZW1lKAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC5ib3ggPSAiaG9yaXpvbnRhbCIsCiAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAsIC0wLjEpLAogICAgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDApCiAgKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIiIsCiAgICAgICB0aXRsZSA9ICIiLAogICAgICAgc2l6ZSA9ICJOdW1iZXIiKQpgYGAKCmBgYHtyIGRhdGEgY2l0eSBDQSBtYXB9CmdncGxvdChwb2ludHNfY2EpICsKICBnZW9tX3NmKAogICAgZGF0YSA9IHN0YXRlX21hcHNfY2EsCiAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICBmaWxsID0gImxpZ2h0Z3JleSIsCiAgICBhbHBoYSA9IDAuNQogICkgKwogIGdlb21fcG9pbnQoYWVzKAogICAgeCA9IGppdHRlcihsb24pLAogICAgeSA9IGppdHRlcihsYXQpLAogICAgY29sb3IgPSBtYXhfam9iLAogICAgc2l6ZSA9IG1heAogICksIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgdmFsdWVzID0gYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLAogICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciCiAgICApLAogICAgbmFtZSA9ICJKb2IgVGl0bGUiCiAgKSArCiAgdGhlbWUoCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgI2xlZ2VuZC5wb3NpdGlvbiA9IGMoMCwwKSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsMCkKICApICsKICBsYWJzKHggPSAiIiwKICAgICAgIHkgPSAiIiwKICAgICAgIHRpdGxlID0gIiIsCiAgICAgICBzaXplID0gIk51bWJlciIpCmBgYAoKYGBge3IgZGF0YSBjaXR5IFRYIG1hcH0KZ2dwbG90KHBvaW50c190eCkgKwogIGdlb21fc2YoCiAgICBkYXRhID0gc3RhdGVfbWFwc190eCwKICAgIGNvbG9yID0gIndoaXRlIiwKICAgIGZpbGwgPSAibGlnaHRncmV5IiwKICAgIGFscGhhID0gMC41CiAgKSArCiAgZ2VvbV9wb2ludChhZXMoCiAgICB4ID0gaml0dGVyKGxvbiksCiAgICB5ID0gaml0dGVyKGxhdCksCiAgICBjb2xvciA9IG1heF9qb2IsCiAgICBzaXplID0gbWF4CiAgKSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKAogICAgICAiQnVzaW5lc3MgQW5hbHlzdCIgPSAiIzAwQjJFNCIsCiAgICAgICJEYXRhIEFuYWx5c3QiID0gIiMwRjJBNDgiLAogICAgICAiRGF0YSBFbmdpbmVlciIgPSAiIzAwOEI4QiIsCiAgICAgICJEYXRhIFNjaWVudGlzdCIgPSAiI0ZDMjk2NyIKICAgICksCiAgICBuYW1lID0gIkpvYiBUaXRsZSIKICApICsKICB0aGVtZSgKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAjbGVnZW5kLnBvc2l0aW9uID0gYygwLDApLCBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwwKQogICkgKwogIGxhYnMoeCA9ICIiLAogICAgICAgeSA9ICIiLAogICAgICAgdGl0bGUgPSAiIiwKICAgICAgIHNpemUgPSAiTnVtYmVyIikKYGBgCgpgYGB7ciBkYXRhIGNpdHkgTm9ydGhlYXN0ZXJuIG1hcH0KZ2dwbG90KHBvaW50c19ub3J0aGVhc3QpICsKICBnZW9tX3NmKAogICAgZGF0YSA9IHN0YXRlX21hcHNfbm9ydGhlYXN0LAogICAgY29sb3IgPSAid2hpdGUiLAogICAgZmlsbCA9ICJsaWdodGdyZXkiLAogICAgYWxwaGEgPSAwLjUKICApICsKICBnZW9tX3BvaW50KGFlcygKICAgIHggPSBqaXR0ZXIobG9uKSwKICAgIHkgPSBqaXR0ZXIobGF0KSwKICAgIGNvbG9yID0gbWF4X2pvYiwKICAgIHNpemUgPSBtYXgKICApLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwKICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IgogICAgKSwKICAgIG5hbWUgPSAiSm9iIFRpdGxlIgogICkgKwogIHRoZW1lKAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAsMCksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIiIsCiAgICAgICB0aXRsZSA9ICIiLAogICAgICAgc2l6ZSA9ICJOdW1iZXIiKQpgYGAKCmBgYHtyIGRhdGEgY2l0eSBNaWR3ZXN0ZXJuIG1hcH0KZ2dwbG90KHBvaW50c19taWR3ZXN0KSArCiAgZ2VvbV9zZigKICAgIGRhdGEgPSBzdGF0ZV9tYXBzX21pZHdlc3QsCiAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICBmaWxsID0gImxpZ2h0Z3JleSIsCiAgICBhbHBoYSA9IDAuNQogICkgKwogIGdlb21fcG9pbnQoYWVzKAogICAgeCA9IGppdHRlcihsb24sIDEwMCksCiAgICB5ID0gaml0dGVyKGxhdCwgMTAwKSwKICAgIGNvbG9yID0gbWF4X2pvYiwKICAgIHNpemUgPSBtYXgKICApLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwKICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IgogICAgKSwKICAgIG5hbWUgPSAiSm9iIFRpdGxlIgogICkgKwogIHRoZW1lKAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAsMCksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIiIsCiAgICAgICB0aXRsZSA9ICIiLAogICAgICAgc2l6ZSA9ICJOdW1iZXIiKQpgYGAKCgpgYGB7ciBkYXRhIGNpdHkgRkwmR0EgbWFwfQpnZ3Bsb3QocG9pbnRzX2ZsKSArCiAgZ2VvbV9zZigKICAgIGRhdGEgPSBzdGF0ZV9tYXBzX2ZsLAogICAgY29sb3IgPSAid2hpdGUiLAogICAgZmlsbCA9ICJsaWdodGdyZXkiLAogICAgYWxwaGEgPSAwLjUKICApICsKICBnZW9tX3BvaW50KGFlcygKICAgIHggPSBqaXR0ZXIobG9uKSwKICAgIHkgPSBqaXR0ZXIobGF0KSwKICAgIGNvbG9yID0gbWF4X2pvYiwKICAgIHNpemUgPSBtYXgKICApLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwKICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IgogICAgKSwKICAgIG5hbWUgPSAiSm9iIFRpdGxlIgogICkgKwogIHRoZW1lKAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAsMCksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIiIsCiAgICAgICB0aXRsZSA9ICIiLAogICAgICAgc2l6ZSA9ICJOdW1iZXIiKQpgYGAKCmBgYHtyIGRhdGEgY2l0eSBXQSBtYXB9CmdncGxvdChwb2ludHNfd2EpICsKICBnZW9tX3NmKAogICAgZGF0YSA9IHN0YXRlX21hcHNfd2EsCiAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICBmaWxsID0gImxpZ2h0Z3JleSIsCiAgICBhbHBoYSA9IDAuNQogICkgKwogIGdlb21fcG9pbnQoYWVzKAogICAgeCA9IGppdHRlcihsb24pLAogICAgeSA9IGppdHRlcihsYXQpLAogICAgY29sb3IgPSBtYXhfam9iLAogICAgc2l6ZSA9IG1heAogICksIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgdmFsdWVzID0gYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLAogICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciCiAgICApLAogICAgbmFtZSA9ICJKb2IgVGl0bGUiCiAgKSArCiAgdGhlbWUoCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgI2xlZ2VuZC5wb3NpdGlvbiA9IGMoMCwwKSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsMCkKICApICsKICBsYWJzKHggPSAiIiwKICAgICAgIHkgPSAiIiwKICAgICAgIHRpdGxlID0gIiIsCiAgICAgICBzaXplID0gIk51bWJlciIpCmBgYAoKYGBge3IgZGF0YSBjaXR5IFROIG1hcH0KZ2dwbG90KHBvaW50c190bikgKwogIGdlb21fc2YoCiAgICBkYXRhID0gc3RhdGVfbWFwc190biwKICAgIGNvbG9yID0gIndoaXRlIiwKICAgIGZpbGwgPSAibGlnaHRncmV5IiwKICAgIGFscGhhID0gMC41CiAgKSArCiAgZ2VvbV9wb2ludChhZXMoCiAgICB4ID0gaml0dGVyKGxvbiksCiAgICB5ID0gaml0dGVyKGxhdCksCiAgICBjb2xvciA9IG1heF9qb2IsCiAgICBzaXplID0gbWF4CiAgKSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKAogICAgICAiQnVzaW5lc3MgQW5hbHlzdCIgPSAiIzAwQjJFNCIsCiAgICAgICJEYXRhIEFuYWx5c3QiID0gIiMwRjJBNDgiLAogICAgICAiRGF0YSBFbmdpbmVlciIgPSAiIzAwOEI4QiIsCiAgICAgICJEYXRhIFNjaWVudGlzdCIgPSAiI0ZDMjk2NyIKICAgICksCiAgICBuYW1lID0gIkpvYiBUaXRsZSIKICApICsKICB0aGVtZSgKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAjbGVnZW5kLnBvc2l0aW9uID0gYygwLDApLCBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwwKQogICkgKwogIGxhYnMoeCA9ICIiLAogICAgICAgeSA9ICIiLAogICAgICAgdGl0bGUgPSAiIiwKICAgICAgIHNpemUgPSAiTnVtYmVyIikKYGBgCgoKYGBge3IgZGF0YSBqb2IgIGFuZCBvdGhlcnMgbnVtYmVyIHBlciB5ZWFyIGluIFROIH0KREFUQSAlPiUKICBmaWx0ZXIod29ya3NpdGVfc3RhdGVfYWJiID09ICJUTiIpICU+JQogIGdyb3VwX2J5KHllYXIsIGRhdGFfcmVsYXRpb24pICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICAKICBnZ3Bsb3QoYWVzKAogICAgeCA9IHllYXIsCiAgICB5ID0gbiwKICAgIGZpbGwgPSBhcy5mYWN0b3IoZGF0YV9yZWxhdGlvbikKICApKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsCiAgICAgICAgICAgcG9zaXRpb24gPSAiZG9kZ2UiLAogICAgICAgICAgIGFscGhhID0gMC44KSArCiAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwKICAgIG5hbWUgPSAiIiwKICAgIGxhYmVscyA9IGMoIkRhdGEgam9icyIsICJPdGhlcnMiKQogICkgKwogIGxhYnMoeSA9ICJcbiBOdW1iZXIiLCB4ID0gIlxuIFllYXIiKSArCiAgI3NjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBmdW5jdGlvbih4KXtwYXN0ZTAoeC8xMDAwLCAnSycpfSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKYGBg